KVM 是款基於 Linux 核心的虛擬化技術,搭配 gui 操作介面後就等同於 VMware Workstation 或是 VirtualBox 這類的軟體。雖然它們也有 Linux 版本,但我覺得 KVM 在效能上是更勝一籌(畢竟是用核心在處理)
用過 KVM 的人應該都知道 Virt-Manager 這套功能完整又簡單的 gui 虛擬機管理程式
我的 server 為了簡潔所以通常不裝 gui,但因為 Virt-Manager 實在太好用,再加上 KVM 裝虛擬機時用預設的 gui 安裝會比較方便,所以我還是裝了肥大的 Gnome 3 只為了用 Virt-Manager 來管理我的虛擬機。
前陣子因為讀到這篇文章,裡頭提到了在 KVM 中可以使用 VNC 來看到虛擬機的畫面,有了這個方法 server 似乎就不需要裝 gui 也可以順利安裝虛擬機,剛好最近想為家裡的 server 升到 CentOS 8,所以就決定來試試看,打造一個沒有 gui 也可以簡單安裝與使用虛擬機的 home server
檢查環境
本機:Ubuntu 18.04
Remote Host:CentOS 8 Minimal Install (headless)
這次的目標就是在沒有 gui 的 CentOS 8 上面安裝 KVM 並且使用 KVM 來安裝虛擬機。
首先檢查 server 的系統是否支援虛擬化
cat /proc/cpuinfo | grep -Eoi "vmx|svm"
# 執行結果:
svm
svm
svm
svm
svm
svm
svm
svm
如果使用 AMD 的 cpu 出現 svm、Intel cpu 出現 vmx 就表示 cpu 的虛擬化有打開,現在一般的 cpu 都有支援,如果沒有出現的話記得先去 BIOS 把相關的選項打開。
上面指令的結果出現 8 個 svm,表示這台電腦最多可以開到 7 台虛擬機(一台機器分配一個 cpu 的情況,扣掉本機一顆)
另外也可以用 lscpu 來檢查
lscpu | grep Virtual
# 執行結果:
Virtualization: AMD-V # AMD-V 即 AMD 的虛擬化技術
安裝 KVM 與相關套件
安裝 KVM
sudo dnf module install virt
安裝相關套件
sudo dnf install virt-install
檢查 KVM mod 是否有載入
lsmod | grep kvm
# 執行結果:
kvm_amd 111304 0
kvm 636965 1 kvm_amd
irqbypass 13503 1 kvm
檢驗 KVM 的 driver 是否完備
virt-host-validate
# 執行結果:
setlocale: No such file or directory
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/kvm exists : PASS
QEMU: Checking if device /dev/kvm is accessible : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : PASS
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
啟動 KVM service
sudo systemctl enable libvirtd.service && sudo systemctl start libvirtd.service
設定虛擬機的網路
KVM 裝好後,它會自動新增一個 NAT 的網路介面,名為 default,如果想要使用不同的連線方式或是修改 default 裡的網段,可以參考 這篇 文章
安裝虛擬機
先將防火牆打開 5900 port,之後 vnc 連線時會用到
sudo firewall-cmd --add-port=5900/tcp --permanent && sudo firewall-cmd --reload
使用virt-install 指令來安裝一個新的虛擬機
sudo virt-install \
--name test \
--memory 1024 \
--vcpus 1 \
--cpu host-model-only \
--os-variant=centos8 \
--cdrom /tmp/CentOS-8.2.2004-x86_64-dvd1.iso \
--disk /kvm/test.qcow2,size=8,bus=virtio,format=qcow2 \
--network network=default,model=virtio \
--network type=direct,source=ens3,model=virtio \
--graphics vnc,listen=0.0.0.0,password=1234
- –name:虛擬機的名稱
- –memory:虛擬機的記憶體大小,單位為 MB
- –vcpus:要使用的 cpu 核心數,沒有特殊用途的話 1 顆就夠
- –cpu:cpu 的類型,使用 host-model-only 讓虛擬機也使用與本機相同的 cpu,可以有較好的效能
- –os-variant(選填):要安裝的 os 範本,有指定的話效能表現會比較好,可以用 osinfo-query os 這個指令來查看支援的範本,將查到的 os Short ID 填在這個項目即可,如果想裝的 os 沒有在裡面,可以參考這個網站 來更新 os 列表
- –cdrom:指定系統 iso 光碟檔的路徑
- –disk:設定虛擬機硬碟的存放位置及大小,size 的單位為 GB,format 一般常用 qcow2
- –network:配給虛擬機的網路卡及其設定,這邊我給虛擬機裝了兩張網卡,network=default,model=virto 這個設定就是使用剛才提到的 default NAT,type=direct,source=ens3,source_mode=bridge,model=virtio 則是設定了 MacVTap 的橋接方式,可以讓 guest 與 host 拿到同一個網段的 ip,詳細說明可以看這篇
- –graphics:虛擬機要使用的遠端螢幕設定,vnc 是比較普遍的選項,另外也可以改用 spice,listen 部分是允許連入這台虛擬機的網段,password 則是 vnc 連線時所需的密碼
# 執行結果:
WARNING Requested memory 1024 MiB is less than the recommended 1536 MiB for OS centos8
WARNING 無法連至圖形介面主控臺:尚未安裝 virt-viewer。請安裝 'virt-viewer' 套件。
WARNING No console to launch for the guest, defaulting to --wait -1
正在開始進行安裝...
分配「test.qcow2」中 | 8.0 GB 00:00:00
Domain installation still in progress.
Waiting for installation to complete.
根據自己想要的設定執行 virt-install,出現上面的畫面時,從本機打開任何可以遠端連 vnc 的軟體,並將連線位址打上 vnc://Remote_Host_IP:5900,就可以看到安裝畫面了
安裝完成後,本次的課題也就大功告成了!
另外再次提醒,這台虛擬機上設了兩張網卡:
- server NAT 網卡
- MacVTap 橋接網卡
如果本機要連這台虛擬機,請使用與自身同網段的 192.168.122.x 來連線。remote server 想連虛擬機的話則必須使用 NAT 的 192.168.123.x 來連,而不能用實體網段的 192.168.122.x,這是 MacVTap 的限制。
另外如果虛擬機是安裝像 Windows 這類有 gui 的系統,那就只能在本機以 vnc 或 spice 來連入了(記得 vnc 的位址一樣是用 server 的 ip 而不是去直連虛擬機的 ip,除非虛擬機有 xrdp 之類的 service)
以現有的硬碟映像檔建立虛擬機
上面的步驟透過光碟 iso 檔來建立虛擬機,算是從無到有最基本的方法,不過如果我們已經有一個裝好系統的硬碟 image 檔,也可以直接用這個 image 來建立虛擬機,可以省掉安裝系統的步驟。
用 image 建立虛擬機也一樣是使用 virt-install,不過執行 virt-install 前,我們先多開一個 terminal-2 然後 ssh 連進我們的 remote hot,接著回到原本的 terminal 執行 virt-install import 的指令
sudo virt-install \
--name take-1 \
--memory 1024 \
--vcpus 1 \
--cpu host-model-only \
--os-variant=centos8 \
--import \
--disk /kvm/take-1.ovl \
--network network=default,model=virtio \
--network type=direct,source=ens3,model=virtio \
--graphics spice,listen=0.0.0.0,password=asdf
- –import:跳過 os 的安裝步驟,直接以現有的 disk image 來建立虛擬機
- –disk:指定 disk image 的位置,如果有多個 –disk 參數,則第一個 disk 將會是虛擬機的開機碟
# 執行結果:
WARNING Requested memory 1024 MiB is less than the recommended 1536 MiB for OS centos8
WARNING Graphics requested but DISPLAY is not set. Not running virt-viewer.
WARNING No console to launch for the guest, defaulting to --wait -1
Starting install...
Domain installation still in progress.
Waiting for installation to complete.
執行完出現上面畫面後,切換到 terminal-2 查詢 listen port 的資訊
sudo netstat -tlnup | grep qemu-kvm
# 執行結果:
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 6439/qemu-kvm
tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 6599/qemu-kvm
注意:
KVM 的 vnc 或 spice service 預設的 listen port 是 5900,所以如果我們已經有一台啟動中主機,那麼再新增虛擬機時,第二台虛擬機的 vnc listen port 就不會是 5900,因為系統已經把 5900 port 給了第一台虛擬機使用,這時 KVM 會將 5900 +1 的 port 開給新的虛擬機 vnc service,因此想用 vnc 看第二台虛擬機的畫面,就必須使用 5901 port
以上面的輸出結果來看 0.0.0.0: 5900 是第一台虛擬機的 listen port,第二行的 5901 就是我們新建第二台虛擬機的 vnc listen port
此時 vnc 連線軟體就要改用 vnc://Remote_Host_IP:5901 來看第二台虛擬機的畫面
如果再開啟第三台基本上就是使用 5902 port 了。記得防火牆要打開這些 port !
KVM 虛擬機的基本操作
安裝完後,就可以用下面幾個最基本的指令來操控虛擬機
顯示所有虛擬機的狀態
sudo virsh list --all
啟動虛擬機
sudo virsh start [VM_Name]
關閉虛擬機
sudo virsh shutdown [VM_Name]
重啟虛擬機
sudo virsh reboot [VM_Name]
KVM 虛擬機系列文章:
參考資料:
How to Install KVM on CentOS/RHEL 8
How To Install KVM on RHEL 8 / CentOS 8 Linux